package gui;

import group.UserGroup;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.TableRowSorter;

import student.Student;

@SuppressWarnings("serial")
public class Overview extends JLayeredPane implements ActionListener
{
	public JPanel contentPane;
	private JButton LoadButton;
	private JButton Save_Button;
	private JButton Splitt_Systemgroup_Button;
	@SuppressWarnings("rawtypes")
	private JList group_list;
	private JTable table;

	@SuppressWarnings("rawtypes")
	public Overview()
	{
		// seminar.Seminar.add();
		this.setLayout(new BorderLayout(0, 0));

		JPanel group_overview_panel = new JPanel();
		add(group_overview_panel, BorderLayout.WEST);
		group_overview_panel.setLayout(new BorderLayout(0, 0));

		JScrollPane groupListScrollPane = new JScrollPane();
		groupListScrollPane.setPreferredSize(new Dimension(190, 300));

		groupListScrollPane.setEnabled(false);
		groupListScrollPane.setToolTipText("");
		group_overview_panel.add(groupListScrollPane);
		// group_overview_panel.setLayout(new BorderLayout(0, 0));

		group_list = new JList();
		group_list.addMouseListener(ListenGrup());

		groupListScrollPane.setViewportView(group_list);
		updateGroups();

		JPanel student_overview_panel = new JPanel();
		this.add(student_overview_panel, BorderLayout.CENTER);
		student_overview_panel.setLayout(new BorderLayout(0, 0));

		JPanel under_table_panel = new JPanel();
		student_overview_panel.add(under_table_panel, BorderLayout.SOUTH);
		under_table_panel.setLayout(new BorderLayout(0, 0));

		JPanel load_save_panel = new JPanel();
		under_table_panel.add(load_save_panel, BorderLayout.WEST);

		LoadButton = new JButton("Laden");
		LoadButton.addActionListener(this); // Button wird dem Listener
											// zugeordnet
		load_save_panel.add(LoadButton);

		Save_Button = new JButton("Speichern");
		Save_Button.addActionListener(this); // Button wird dem Listener
												// zugeordnet
		load_save_panel.add(Save_Button);

		JPanel panel = new JPanel();
		under_table_panel.add(panel, BorderLayout.EAST);

		Splitt_Systemgroup_Button = new JButton("Systemgruppe aufteilen");
		panel.add(Splitt_Systemgroup_Button);

		JScrollPane scrollPane = new JScrollPane();
		student_overview_panel.add(scrollPane, BorderLayout.CENTER);

		table = new JTable();
		updateTable();

		scrollPane.setViewportView(table);
		Splitt_Systemgroup_Button.addActionListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent ae)
	{
		// Die Quelle wird mit getSource() abgefragt und mit den
		// Buttons abgeglichen. Wenn die Quelle des ActionEvents einer
		// der Buttons ist, wird der Text des JLabels entsprechend ge�ndert
		if (ae.getSource() == this.LoadButton)
		{
			GUI.statusausgabe("Wird geladen");
			loadFileWindow();
			updateTable();
			// GUI.updateAll();
		} else if (ae.getSource() == this.Save_Button)
		{
			GUI.statusausgabe("Wird gespeichert");
			saveAs(null);
			GUI.updateAll();
		} else if (ae.getSource() == this.Splitt_Systemgroup_Button)
		{
			GUI.statusausgabe("Wird aufgeteilt");
			seminar.Seminar.distributeStudents();
			updateTable();
			GUI.updateAll();
		}
	}

	@SuppressWarnings("unchecked")
	private void updateGroups()
	{
		int i = 1;
		Object[] temp = new Object[seminar.Seminar.getUsergoups().size() + 1];
		Iterator<UserGroup> iter_gruppen = seminar.Seminar.getUsergoups()
				.iterator();
		temp[0] = "Systemgruppe";
		while (iter_gruppen.hasNext())
		{
			UserGroup userGruppe = iter_gruppen.next();
			temp[i] = userGruppe.getName();
			i++;

		}
		group_list.setListData(temp);
	}

	private void loadFileWindow()
	{
		JFileChooser fc = new JFileChooser();
		fc.setFileFilter(new FileNameExtensionFilter("Textdateien", "txt"));

		int state = fc.showOpenDialog(null);

		if (state == JFileChooser.APPROVE_OPTION)
		{
			File file = fc.getSelectedFile();
			if (file.canRead())
			{
				seminar.Seminar.read_txt(file);
				return;
			}

		} else
			System.err.println("Auswahl abgebrochen");

	}

	private MouseListener ListenGrup()
	{
		return new MouseAdapter() {

			@Override
			public void mousePressed(MouseEvent evt)
			{
				updateTable();
			}
		};
	}

	public void updateTable()
	{
		ArrayList<Student> students;
		if (group_list.getSelectedIndex() > 0)
		{
			students = seminar.Seminar.getUsergoups()
					.get(group_list.getSelectedIndex() - 1).getMembers();
		} else
		{
			students = seminar.Seminar.getSystemgroup().getMembers();
		}
		TableModel_students mymodel = new TableModel_students(students);

		TableRowSorter<TableModel_students> sorter = new TableRowSorter<TableModel_students>();
		table.setRowSorter(sorter);
		sorter.setModel(mymodel);

		table.setModel(mymodel);
		table.updateUI();

		// vielleicht nicht schlecht....

		updateGroups();
	}

	boolean saveAs(String pfad)
	{

		JFileChooser chooser;
		if (pfad == null)
			pfad = System.getProperty("user.home");

		File file = new File(pfad.trim());

		chooser = new JFileChooser(pfad);
		chooser.setDialogType(JFileChooser.SAVE_DIALOG);
		FileNameExtensionFilter plainFilter = new FileNameExtensionFilter(
				"Textdatei", "txt");

		chooser.removeChoosableFileFilter(chooser.getAcceptAllFileFilter());
		chooser.setFileFilter(plainFilter);

		chooser.setDialogTitle("Speichern unter...");
		chooser.setVisible(true);

		int result = chooser.showSaveDialog(this);

		if (result == JFileChooser.APPROVE_OPTION)
		{
			
			pfad = chooser.getSelectedFile().toString(); 
			

			
			if (!pfad.endsWith(".txt")){
					pfad +=  ".txt"; // +"txt"
				}
			file = new File(pfad);
			if (plainFilter.accept(file))
			{
				GUI.statusausgabe(pfad + " kann gespeichert werden.");
				if (file.exists())
				{
					String[] optionen = { "Ja", "Abbrechen" };
					int n = JOptionPane
							.showOptionDialog(
									null,
									"Es existiert bereits eine Datei mit dem angegeben Dateinamen.\nM�chten sie die Datei �berschreiben?", // Fragetext
									"Datei existiert bereits.", // Titel
									JOptionPane.OK_CANCEL_OPTION,
									JOptionPane.QUESTION_MESSAGE, // Icon
									null, optionen, optionen[0]);
					if (n == JOptionPane.NO_OPTION)
					{
						GUI.statusausgabe("Speichervorgang abgebrochen!");
						return false;

					}
				}
				GUI.statusausgabe(pfad + "wird abgespeichert.");
				try
				{
					seminar.Seminar.writeTxt(pfad);
				} catch (IOException e)
				{
					e.printStackTrace();
				}
				GUI.statusausgabe("Speichervorgang war erfolgreich");
			} else
				GUI.statusausgabe(pfad + " ist der falsche Dateityp.");

			chooser.setVisible(false);
			return true;
		}
		GUI.statusausgabe("Speichervorgang abgebrochen!");
		chooser.setVisible(false);
		return false;
	}
}